Docker for AWS を試してみた
はじめに
以前の記事で Docker for AWS について触れました。
せっかくなので、Docker for AWS を試してみたいなと思い検証してみました。
Docker for AWS とは
上記のページから引用すると下記のとおりです。
Docker for AWSは、AWS上でアプリケーションを構築、アセンブル、および出荷するための統合された、配置が容易な環境で、基盤となるAWS IaaSサービスを最適に活用するために最適化されたネイティブAWSアプリケーションです。ポータブルアプリを導入する Docker for AWSには、ソフトウェアをインストールする必要はありません。
ブラウザとAWSアカウントが必要なだけで、数回クリックするだけでDockerをプロビジョニングできます。Docker for AWSはデフォルトでTLSを使用してエンドツーエンドのDocker Enginesをインストールし、AWS Autoscaling、Elastic Load Balancer、Elastic Block Storeと統合されています。
環境構築した感触から個人の印象としては、moby linux AMI を利用し Cloudformation によって構築される Docker クラスター用のテンプレートというイメージです。
筆者の検証環境について
以下のバージョンを利用して、検証を行いました。
- Docker for Mac 17.03.1-ce
- macOS Sierra 10.12.5(16F73)
~ $ docker version Client: Version: 17.03.1-ce API version: 1.27 Go version: go1.7.5 Git commit: c6d412e Built: Tue Mar 28 00:40:02 2017 OS/Arch: darwin/amd64 Server: Version: 17.03.1-ce API version: 1.27 (minimum version 1.12) Go version: go1.7.5 Git commit: c6d412e Built: Fri Mar 24 00:00:50 2017 OS/Arch: linux/amd64 Experimental: true ~ $ sw_vers ProductName: Mac OS X ProductVersion: 10.12.5 BuildVersion: 16F73 ~ $
Docker for AWS 環境を構築
Docker for AWS の構築にあたり、目を通しておくドキュメントは以下かと思われます。
今回は、Docker Community Edition (CE) for AWS の Stable channel を利用します。 予め AWS アカウントでサインアップし、上記のリンク先ページへアクセスしておいてください。
スタックの作成
まずは、テンプレートの選択画面です。次へをクリックします。
次に詳細の指定画面となります。変更するパラメータがあれば、お好みで変更してから次へをクリックします。 本記事では、Swarm Manager 数を 1 へ、worker node 数を 2 へ変更しました。
オプション選択です。こちらもお好みで変更してから次へをクリックします。
最終確認画面です。本記事では、「AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。」のチェックボックスにチェックを入れて作成ボタンをクリックしました。
スタックの作成が開始します。
おおよそですが、10分程度で CREATE_COMPLETE に遷移しました。
Docker for AWS 環境にアプリケーションをデプロイしてみる
まずは、マネージャーノードの Public IP を確認します。 EC2 インスタンスから、Docker-Manager で検索することで特定できます。
Public IP が確認出来れば、SSH で接続します。
$ ssh -i <path-to-ssh-key> docker@<ssh-host> Welcome to Docker! ~ $ uname -a Linux a8b81e8dfebc 4.9.31-moby #1 SMP Sat Jun 24 06:29:12 UTC 2017 x86_64 Linux ~ $ cat /etc/os-release NAME="Alpine Linux" ID=alpine VERSION_ID=3.5.2 PRETTY_NAME="Alpine Linux v3.5" HOME_URL="http://alpinelinux.org" BUG_REPORT_URL="http://bugs.alpinelinux.org" ~ $
moby linux が利用されていますね。 swarm manager node から、docker info や docker node ls を実行することにより環境構成を確認できます。
~ $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 2p4dsfkwuu6li9beynep7i1wa ip-172-31-17-51.region.compute.internal Ready Active 590r1psq186nvgsm27zq52u11 * ip-172-31-25-8.region.compute.internal Ready Active Leader mlwo9vwvq41abmxhqilb3rt2n ip-172-31-10-91.region.compute.internal Ready Active
作業PC(macOS)側で swarm mangaer node の Docker socket 宛へ SSH トンネルを掘れば、クラスタノード上の docker コマンドも PC からリモートで実行が可能です。
$ ssh -i <path-to-ssh-key> -NL localhost:2374:/var/run/docker.sock docker@<ssh-host> & $ docker -H localhost:2374 info
DOCKER_HOST 環境変数を設定すれば、さらに -H オプションの指定も不要です。
$ export DOCKER_HOST='localhost:2374' $ docker info
ここまで来れば、コンテナとサービスの作成を開始できます。
以下のコマンドを実行することにより、サービスが作成され nginx コンテナが起動します。
~ $ docker service create --name nginx -p 80:80 nginx ygooeewderty55b2qpxsn0o3m ~ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES de2a6848dcd8 nginx:latest "nginx -g 'daemon ..." 31 seconds ago Up 30 seconds 80/tcp nginx.1.l869nrxxp1yge3egkrmvq4ndb a8b81e8dfebc docker4x/shell-aws:17.06.0-ce-aws1 "/entry.sh /usr/sb..." 29 minutes ago Up 29 minutes 0.0.0.0:22->22/tcp shell-aws 3518c620be43 docker4x/l4controller-aws:17.06.0-ce-aws1 "loadbalancer run ..." 29 minutes ago Up 29 minutes l4controller-aws d63efac9c67f docker4x/meta-aws:17.06.0-ce-aws1 "metaserver -iaas_..." 29 minutes ago Up 29 minutes 172.31.25.8:9024->8080/tcp meta-aws 02395b5e8fc8 docker4x/guide-aws:17.06.0-ce-aws1 "/entry.sh" 29 minutes ago Up 29 minutes guide-aws
公開されたポート -p 80:80 は、ELB(Classic)を通じて自動的に公開されます。
ELB の DNSName を確認し、ブラウザからアクセスしてみます。
~ $ aws elb describe-load-balancers | jq .LoadBalancerDescriptions[].DNSName "Docker-ExternalLoa-1AWAAMPKSJ20G-nnnnnnnnnn.region.elb.amazonaws.com"
nginx の Welcome ページが表示されることを確認できました。
worker node に接続するには
worker node への SSH 接続は、public Internet を介したアクセスが許可されていません。 一旦、manager node へ接続し SSH agent forwarding を有効化した状態で private network を介して接続する必要があります。
まず始めに、SSH agent forwarding を有効化します。 なお、macOS を利用している場合は、以下のコマンドを利用することにより、パスフレーズもキーチェーンに格納されるため、PC 再起動後も有効になります。
$ ssh-add -K ~/.ssh/your_key $ ssh-add -L #エージェント内のキーを表示する
次に、swarm manager node 経由で worker node へ SSH (private network を介して)接続を行います。
~ $ ssh -A docker@<ssh-host> Welcome to Docker! ~ $ ssh [email protected] Welcome to Docker! ~ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES acd20d64a32d docker4x/shell-aws:17.06.0-ce-aws1 "/entry.sh /usr/sb..." About an hour ago Up About an hour 0.0.0.0:22->22/tcp shell-aws f5c61a26d17a docker4x/guide-aws:17.06.0-ce-aws1 "/entry.sh" About an hour ago Up About an hour guide-aws ~ $
さいごに
今回は、Docker for AWS 環境を構築し nginx コンテナを起動するところまでを試してみました。 手元の環境から、SSH トンネルを介した Docker HOST へのリモートアクセスを行うことにより AWS 環境へシームレスにコンテナを起動することが出来そうです。
他にも色々と試してみたいことがありますが、本記事は以上となります。 ではでは